import Mock from "mockjs";

/**
 * 通过id获取sku信息，并根据 sku.id 去 train_product_sku_bind 表中查找绑定的服务或课程，
 * 然后根据 bind_type 和 bind_id 去 train_product_sku 表中查找对应的服务或课程，获取到服务或课程的名称，
 * 组合起来填入到 sku.skuBindList 中。
 *
 * 基本信息：select * from train_product_sku where id=${skuId}
 * skuBindList：select * from train_product_sku_bind where sku_id=${skuId}
 *
 * @param skuId skuId
 * @returns sku信息
 */
export const getSkuById = async (skuId: number): Promise<ProductSku> => {
  const res = await Mock.mock({
    id: skuId,
    spuId: "@integer(1, 100)",
    spuName: "@ctitle(5, 10)",
    skuName: "@ctitle(10, 20)",
    price: "@integer(100, 1000)",
    marketPrice: "@integer(100, 1000)",
    costPrice: "@integer(100, 1000)",
    picUrl: "@image(200x200, @color, @word)",
    stock: "@integer(100, 1000)",

    "skuBindList|3": [
      {
        bindType: "@integer(1, 3)",
        bindId: "@integer(1, 3)",
        bindTitle: "@ctitle(5, 10)",
      },
    ],
  });

  return res;
};

/**
 * 创建订单
 *
 * 获取传入的表单中是否带有 saleUserId 字段，如果有就使用这个字段的值作为 sale_user_id。
 * 如果没有，就把 remark 字段解析为一个对象，取得其中的 phone，然后根据 phone 从 client_entroll_clue 表
 * 中获取 获取 client_user_id，把这个 client_user_id 作为 sale_user_id。（这个过程中，remark可能为空对象
 * 或者不是对象，所以要做一些判断）
 * 如果都没有，那就不传 sale_user_id。
 *
 * @param param 购买数据
 * @returns 创建好的订单
 */
export const createOrder = async (
  param: OrderCreateParam
): Promise<OrderCreateResult> => {
  console.log("创建订单", param);
  return Promise.resolve({
    id: 1,
    orderNo: "123456789",
    skuId: param.skuId,
    skuSource: 1,
    amount: param.amount,
    orderPrice: 100,
    remark: param.remark,
    userRemark: param.userRemark,
    status: 1,
    createTime: new Date().toISOString(),
  });
};

/**
 * 支付订单
 *
 * 传入订单id，模拟支付订单。
 * 支付回调：
 * - 如果支付失败或者超时就抛出异常（还不确定怎么处理）。
 * - 如果支付成功就更新订单的各个状态和支付时间等。
 * - 服务开通：
 *   根据订单的id在trade_order表中获取到订单对应的sku_id，然后在sku_bind表中获取sku_id绑定的全部服务或课程，逐一开通。
 *   - 如果是服务，就在member_service表中插入一条记录。
 *   - 如果是课程，就在member_course表中插入一条记录。
 * - 根据订单中的 skuId 从 client_checkout_config 表中获取分润配置（如果没有就不生成分润结算单）。
 *   - 如果有分润配置(client_checkout_config)就根据分润配置生成分润结算单(client_checkout_order)
 *   - 订单中的 sale_user_id 对应分润配置的 sale_bouns
 *   - 订单中的 user_id 对应用户的 inviter_user_id(邀请者id) 对应分润配置的 invite_bouns
 *   - 继续获取上方用户邀请者的再上一级邀请者，检查是否为超级代理(sale_type=2)，如果是则这个用户对应分润配置的 agent_bouns
 *   - 分润配置中还有一个固定分账列表(fixed_bouns)，也要遍历生成对应的分润结算单
 * 所以最终目标是，订单支付成功后，更改学员报名状态，并在 client_checkout_order 中产生几个(也可能没有，根据配置来)分润结算单。
 *
 * @param orderId 订单id
 * @returns 支付结果
 */
export const payOrder = async (orderId: number): Promise<boolean> => {
  return Promise.resolve(true);
};

/**
 * 重要 - 分页获取全部类型为“普通商品”的商品列表
 *
 * select * from train_product_spu
 *  where spu_status=1
 *  order by sort_no desc
 *  limit ${params.pageSize}
 *  offset ${params.pageSize * (params.pageNo - 1)}
 *
 * @returns 商品列表
 */
export const getAllNormalSpuList = (params: PageParams) =>
  Promise.resolve<Res<ListProductSpu[]>>(
    Mock.mock({
      code: 0,
      msg: "success",
      "data|10": [
        {
          id: "@integer(1, 100)",
          spuName: "@ctitle",
          spuDesc: "@ctitle(10, 20)",
          coverUrl: "@image(336x336, @color, @word)",
          price: "@integer(1, 100)",
          totalStock: "@integer(1, 100)",
          showStock: "@boolean",
          salesCount: "@integer(1, 100)",
        },
      ],
    })
  );

/**
 * 重要 - 获取商品详情
 *
 * select * from train_product_spu
 *  where id=${spuId}
 *
 * @param spuId 商品id
 * @returns 商品详情
 */
export const getNormalSpuDetailById = (spuId: number) =>
  Promise.resolve<Res<ProductSpu>>(
    Mock.mock({
      code: 0,
      msg: "success",
      data: {
        id: spuId,
        spuName: "@ctitle",
        spuDesc: "@ctitle(10, 20)",
        coverUrl: "@image(336x230, @color, @word)",
        videoUrl: "@url",
        "picUrls|3": ["@image(336x230, @color, @word)"],
        // html 图文
        detail: `
          <p>@cparagraph(3, 5)</p>
          <img src="@image(336x230, @color, @word)" />
          <p>@cparagraph(3, 5)</p>
        `,
        price: "@integer(1, 100)",
        totalStock: "@integer(1, 100)",
        showStock: "@boolean",
        salesCount: "@integer(1, 100)",
      },
    })
  );

/**
 * 重要 - 根据商品id获取商品sku列表
 *
 * select * from train_product_sku
 *  where spu_id=${spuId}
 *
 * @param spuId 商品id
 * @returns 商品sku列表
 */
export const getSkuListBySpuId = (spuId: number) =>
  Promise.resolve<Res<ListProductSku[]>>(
    Mock.mock({
      code: 0,
      msg: "success",
      "data|3": [
        {
          id: "@integer(1, 100)",
          skuName: "@ctitle",
          price: "@integer(1, 100)",
          originalPrice: "@integer(1, 100)",
          picUrl: "@image(336x230, @color, @word)",
          stock: "@integer(1, 100)",
        },
      ],
    })
  );

/**
 * 次要 - 获取商品分类列表
 *
 * select * from train_product_category
 *  where category_status=1
 *  order by sort_no desc
 *
 * @returns 商品分类列表
 */
export const getAllProductCategoryList = () =>
  Promise.resolve<Res<ProductCategory[]>>(
    Mock.mock({
      code: 0,
      msg: "success",
      "data|10": [
        {
          id: "@integer(1, 100)",
          categoryName: "@ctitle",
          description: "@cparagraph",
          picUrl: "@image(336x230, @color, @word)",
          "children|3": [
            {
              id: "@integer(1, 100)",
              categoryName: "@ctitle",
              description: "@cparagraph",
              picUrl: "@image(336x230, @color, @word)",
              children: [],
            },
          ],
        },
      ],
    })
  );

/**
 * 次要 - 根据分类获取商品列表
 *
 * select * from train_product_spu
 *  where spu_status=1 and category_id=${params.categoryId}
 *  order by sort_no desc
 *  limit ${params.pageSize}
 *  offset ${params.pageSize * (params.pageNo - 1)}
 *
 * @param categoryId 商品分类id
 * @returns 商品列表
 */
export const getNormalSpuListByCategoryId = (
  params: PageParams & { categoryId: number }
) =>
  Promise.resolve<Res<ListProductSku[]>>(
    Mock.mock({
      code: 0,
      msg: "success",
      "data|10": [
        {
          id: "@integer(1, 100)",
          spuName: "@ctitle",
          spuDesc: "@ctitle(10, 20)",
          coverUrl: "@image(336x230, @color, @word)",
          price: "@integer(1, 100)",
          totalStock: "@integer(1, 100)",
          showStock: "@boolean",
          salesCount: "@integer(1, 100)",
        },
      ],
    })
  );
